// 遍历一个 已有类型，用它的 键名 作为 新类型 的 键名，生成 新类型
// 首先他得到一个对象类型
// 映射的符号是 in ,in + 任意联合类型，
// 语法:
// {[类型A in 联合类型B]:类型C},对 联合类型 的 每一个类型，都对应生成 一个 对象类型 的属性
type OnlyBoolsAndHorses = {
    [key: string]: boolean | number;
  };

  type OptionsFlags<Type> = {
  [prop in keyof Type]: string;
  };
  type asda = OptionsFlags<OnlyBoolsAndHorses>


//   映射修饰符
    // 映射期间可以使用两个额外的修饰符，这两个修饰符叫做映射修饰符
            // -readonly
            // 映射的时候去掉只读属性
            type adea = {
                readonly a:string;
                readonly b :number
            }
            // 需求是，拷贝adea类型，但是要去掉只读修饰符
            type asdasda<T> ={
               -readonly [das in keyof T]:T[das]
            } 
            type fred = asdasda<adea>

            // -?:
            // 映射时去掉可选属性
            type daeedfa = {
                a:number,
                b?:string
            }
            type adfs<T> = {
                [das in keyof T] -?: T[das]
            }
            type afds= adfs<daeedfa>
            const dass:afds = {
                a:1,
                b:'1'
            }

    // as重映射
    // 最终映射出的属性名，可以用as来重新指定